"""
工厂模式（Factory Pattern）提供了一种创建对象的方式，使得创建对象的过程与使用对象的过程分离。
工厂模式提供了一种创建对象的方式，而无需指定要创建的具体类。
通过使用工厂模式，可以将对象的创建逻辑封装在一个工厂类中，而不是在客户端代码中直接实例化对象，这样可以提高代码的可维护性和可扩展性。
意图：
    定义一个创建对象的接口，让其子类决定实例化哪一个具体的类。工厂模式使对象的创建过程延迟到子类。
适用性:
    当我们需要在不同条件下创建不同实例时。
结构：
    抽象产品（Abstract Product）：定义了产品的共同接口或抽象类。它可以是具体产品类的父类或接口，规定了产品对象的共同方法。
    具体产品（Concrete Product）：实现了抽象产品接口，定义了具体产品的特定行为和属性。
    抽象工厂（Abstract Factory）：声明了创建产品的抽象方法，可以是接口或抽象类。它可以有多个方法用于创建不同类型的产品。
    具体工厂（Concrete Factory）：实现了抽象工厂接口，负责实际创建具体产品的对象。
"""
from abc import ABC, abstractmethod


# 抽象产品 A
class DatabaseConnect(ABC):
    @abstractmethod
    def connect(self):
        pass


# 具体产品 A1
class MysqlConnection(DatabaseConnect):
    def connect(self):
        print('Connected to Mysql database.')


# 具体产品 A2
class PostgresqlConnection(DatabaseConnect):
    def connect(self):
        print('Connected to Postgresql database.')


# 创建工厂
class DatabaseConnectFactory:
    def create_connection(self, database_type):
        if database_type is None:
            return None

        if database_type.upper() == 'MysqlConnection'.upper():
            return MysqlConnection()
        elif database_type.upper() == 'PostgresqlConnection'.upper():
            return PostgresqlConnection()

        return None


"""
# 抽象工厂 A
class DatabaseConnectionFactory(ABC):
    @abstractmethod
    def create_connection(self):
        pass


# 具体工厂 A1
class MySQLConnectionFactory(DatabaseConnectionFactory):
    def create_connection(self):
        return MySQLConnect()


# 具体工厂 A2
class PostgreSQLConnectionFactory(DatabaseConnectionFactory):
    def create_connection(self):
        return PostgreSQLConnection()
"""

if __name__ == '__main__':
    factory = DatabaseConnectFactory()
    mysql_connection = factory.create_connection('MysqlConnection')
    postgresql_connection = factory.create_connection('PostgresqlConnection')
    mysql_connection.connect()
    postgresql_connection.connect()
"""
    mysql_factory = MySQLConnectionFactory()
    mysql_connection = mysql_factory.create_connection()
    mysql_connection.connect()

    postgres_factory = PostgreSQLConnectionFactory()
    postgres_connection = postgres_factory.create_connection()
    postgres_connection.connect()
"""
